package com.xu.springboot04;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

/**
 * 数据访问
 *
 * 1.数据源的自动配置 - HikariDataSource
 *
 * 1).导入 JDBC 场景，即导入 spring-boot-starter-data-jdbc 场景依赖，导入这个场景之后，会自动导入数据源(hikari)、jdbc、事务。
 *    但是没有导入驱动，因为官方并不知道我们接下里要操作什么数据库。另外，为了使数据库版本和驱动版本对应，也就是想要修改
 *    驱动版本，可以有两种方法：
 *          i.直接依赖引入具体版本（maven 的就近依赖原则）
 *          ii.重新声明版本（maven 的属性的就近优先原则）
 * 2).分析自动配置，自动配置的类如下：
 *          DataSourceAutoConfiguration: 数据源的自动配置
 *              修改数据源相关的配置：spring.datasource
 *              数据库连接池的配置，是自己容器中没有 DataSource 才自动配置的
 *              底层配置好的连接池是：HikariDataSource
 *          DataSourceTransactionManagerAutoConfiguration: 事务管理器的自动配置
 *          JdbcTemplateAutoConfiguration: JdbcTemplate 的自动配置，可以来对数据库进行 crud
 *              可以修改这个配置项 @ConfigurationProperties(prefix = "spring.jdbc") 来修改 JdbcTemplate
 *              JdbcTemplate；容器中有这个组件
 *          JndiDataSourceAutoConfiguration：jndi 的自动配置
 *          XADataSourceAutoConfiguration：分布式事务相关的
 * 3).修改配置项
 * 4).测试
 *
 * 2.整合 Mybatis 操作
 *
 *  2.1.配置模式:
 *        1).全局配置文件
 *        2).SqlSessionFactory: 自动配置好了
 *        3).SqlSession：自动配置了 SqlSessionTemplate 组合了SqlSession
 *        4).只要我们写的操作 MyBatis 的接口标注了 @Mapper 就会被自动扫描进来
 *  2.2.修改配置文件中 mybatis.configuration下面的所有，就是相当于改 mybatis 全局配置文件中的值，因此可以不写全局；配置文件，
 *      所有全局配置文件的配置都放在 configuration 配置项中即可
 *  2.3.因此，整合 Mybatis 的具体操作如下：
 *        1).导入 mybatis 官方 starter
 *        2).编写 mapper 接口。标准 @Mapper 注解
 *        3).编写 sql 映射文件并绑定 mapper 接口
 *        4).在 application.yaml 中指定 Mapper 配置文件的位置，以及指定全局配置文件的信息
 *
 *        # 配置 mybatis 规则
 *        mybatis:
 *          config-location: classpath:mybatis/mybatis-config.xml  #全局配置文件位置
 *          mapper-locations: classpath:mybatis/mapper/*.xml  # sql 映射文件位置
 *
 * 3.整合 Mybatis-plus 插件
 *
 * 3.1 自动配置
 *        1).MybatisPlusAutoConfiguration 配置类，MybatisPlusProperties 配置项绑定。mybatis-plus：xxx 就是对 mybatis-plus 的定制
 *        2).SqlSessionFactory 自动配置好。底层是容器中默认的数据源
 *        3).mapperLocations 自动配置好的。有默认值。classpath*:/mapper/(**)/*.xml；任意包的类路径下的所有 mapper 文件夹下任意路径下
 *          的所有 xml 都是 sql 映射文件。建议以后 sql 映射文件，放在 mapper下
 *        4).@Mapper 标注的接口也会被自动扫描；另外也可以使用注解 @MapperScan("com.xu.admin.mapper") 进行批量扫描就行
 *        5).容器中也自动配置好了 SqlSessionTemplate
 *        6).只需要我们的 Mapper 继承 BaseMapper 就可以拥有 crud 能力
 *
 * 3.2 总结
 *        总结下来就是 mapper 文件夹下的 .xml 文件会被默认扫描，而 @Mapper 注解标注的 Mapper 接口也会被自动扫描，全局配置文件可以使用
 *        mybatis-plus: xxx 来进行配置
 *
 * 4.数据库驱动
 *
 * 数据库驱动是不同数据库开发商（比如 oracle mysql 等）为了某一种开发语言环境（比如 java）能够实现统一的数据库调用而
 * 开发的一个程序，他的作用相当于一个翻译人员，将 Java 语言中对数据库的调用语言通过这个翻译翻译成各个种类的数据库自己
 * 的数据库语言，当然这个翻译（数据库驱动）是由各个开发商针对统一的接口自定义开发的。
 *
 * 5.Java 中的数据源
 *
 * 数据源就是通过数据库的用户名、密码等信息建立的数据库连接，来构建数据库连接池。普通的连接数据库是建立一个连接，执行完 sql 之后，
 * 就会关闭，再次连接还需要重复上述步骤。而数据源连接池会根据你的参数建立多个数据库连接并缓存，你每次连接数据库的时候就可以从连接
 * 池中获取一个连接，去执行 sql，用完会放入连接池。这样，就避免了连接数据库的开销，也减少了对数据库的压力。
 *
 */

@ServletComponentScan(basePackages = "com.xu.springboot04.servlet")
@SpringBootApplication
public class Springboot04Application {

    public static void main(String[] args) {
        SpringApplication.run(Springboot04Application.class, args);
    }

}
